///////////////////////////////
// Analizador sintáctico
///////////////////////////////

parser grammar AnalizadorParser;

options {
  language = Java;
  tokenVocab = AnalizadorLexer;
  ASTLabelType = MiArbol;
  output = AST;
}

tokens {
  LISTA_INST;
}

@header {
  package practpl.diez;
}

@members {
     
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
 
}

instrucciones : (instruccion SEPARADOR)* -> ^(LISTA_INST (instruccion)*)
;

instruccion: expresion | asignacion;

asignacion : IDENT ASIGNA expresion;

expresion : exp_mult ((operadores^|comparadores^) exp_mult)* ;

exp_mult : exp_base ((MULT^|DIV^) exp_base)* ;

exp_base : (MENOS^)? (NUMERO
| PARENTA! expresion PARENTC!
| IDENT)
;

operadores: MAS | MENOS;
comparadores: MAYOR | MENOR | MENORIGUAL | MAYORIGUAL | COMPARA | DISTINTO;
